Skip to content

Conversation

@jostnes
Copy link
Contributor

@jostnes jostnes commented Dec 14, 2022

Description

This PR adds a new validation (verifyProductTypeScreenLoaded()) for the add product test to validate that the correct product screen is displayed. This also adds 2 new add product (virtual and variable) UI tests.

Testing instructions

Tests should pass in CI and locally. The tests should also fail when the expected fields are not displayed on screen.


  • I have considered if this change warrants user-facing release notes and have added them to RELEASE-NOTES.txt if necessary.

@jostnes jostnes requested a review from a team as a code owner December 14, 2022 08:29
@jostnes jostnes added feature: product details Related to adding or editing products, including Product Settings. category: ui tests Related to UI testing. labels Dec 14, 2022
@wpmobilebot
Copy link
Collaborator

wpmobilebot commented Dec 14, 2022

You can test the changes from this Pull Request by:
  • Clicking here or scanning the QR code below to access App Center
  • Then installing the build number pr8407-c9a64bc on your iPhone

If you need access to App Center, please ask a maintainer to add you.

Copy link
Contributor

@pachlava pachlava left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wow, that's a lot of new tests, @jostnes 👍

I left some comments, but they are nitpicks, nothing really serious. I'm approving the PR as is, and you can adjust it as you like.

Thank you 🙇

Comment on lines +85 to +86
let productTypeLabel = NSPredicate(format: "label CONTAINS[c] %@", productType)
app.staticTexts.containing(productTypeLabel).firstMatch.tap()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just thinking aloud: the buttons for product type selection have no identifiers (as of now), so identifiers can't be used (which would be justified, since this non-asserting function can potentially be used in tests for localizations). So, we can go for exact text values (as you did before). Is there a reason for less strict locator (only part of a string / case-insensitive) that you're using now?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah i actually tried to add identifiers for the cells but it looks like it will take more effort than i anticipated so i dropped that for now.

so the reason is that i wanted to be able to reuse it in the test like this:

            ...
            .selectProductType(productType: productType)
            .verifyProductTypeScreenLoaded(productType: productType)
            ...

the test wants the product type in both, using simple physical product as an example, in select product the text for that is Simple physical product and in add product screen it's Physical, the common denominator in both is the word physical (case-insensitive) so i decided to go with that. it fits the needs of the test case while still keeping it reusable and clear.

Comment on lines 51 to 54
let priceLabel = NSPredicate(format: "label CONTAINS[c] %@", "price")
let inventoryLabel = NSPredicate(format: "label CONTAINS[c] %@", "inventory")
let productTypeLabel = NSPredicate(format: "label CONTAINS[c] %@", productType)
let addVariationLabel = NSPredicate(format: "label CONTAINS[c] %@", "add variations")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since this is an asserting function, I think it would benefit from more strict matching (this is a tested code):

Suggested change
let priceLabel = NSPredicate(format: "label CONTAINS[c] %@", "price")
let inventoryLabel = NSPredicate(format: "label CONTAINS[c] %@", "inventory")
let productTypeLabel = NSPredicate(format: "label CONTAINS[c] %@", productType)
let addVariationLabel = NSPredicate(format: "label CONTAINS[c] %@", "add variations")
let priceLabel = NSPredicate(format: "label == 'Add Price'")
let inventoryLabel = NSPredicate(format: "label == 'Inventory'")
let productTypeLabel = NSPredicate(format: "label ==[c] '\(productType)'")
let addVariationLabel = NSPredicate(format: "label == 'Add variations'")

Also, it would be easier to understand what exactly is missing, if an assertion fails.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

updated in c9a64bc

Comment on lines 59 to 68

// different product types displays different fields on add product screen
// this is to validate that the correct screens are displayed
switch productType {
case "physical", "virtual":
XCTAssertTrue(app.staticTexts.containing(priceLabel).firstMatch.exists)
XCTAssertTrue(app.staticTexts.containing(inventoryLabel).firstMatch.exists)
case "variable":
XCTAssertTrue(app.staticTexts.containing(addVariationLabel).firstMatch.exists)
XCTAssertTrue(app.staticTexts.containing(inventoryLabel).firstMatch.exists)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

inventoryLabel is present for both cases, so it can be moved to common?

Suggested change
// different product types displays different fields on add product screen
// this is to validate that the correct screens are displayed
switch productType {
case "physical", "virtual":
XCTAssertTrue(app.staticTexts.containing(priceLabel).firstMatch.exists)
XCTAssertTrue(app.staticTexts.containing(inventoryLabel).firstMatch.exists)
case "variable":
XCTAssertTrue(app.staticTexts.containing(addVariationLabel).firstMatch.exists)
XCTAssertTrue(app.staticTexts.containing(inventoryLabel).firstMatch.exists)
XCTAssertTrue(app.staticTexts.containing(inventoryLabel).firstMatch.exists)
// different product types displays different fields on add product screen
// this is to validate that the correct screens are displayed
switch productType {
case "physical", "virtual":
XCTAssertTrue(app.staticTexts.containing(priceLabel).firstMatch.exists)
case "variable":
XCTAssertTrue(app.staticTexts.containing(addVariationLabel).firstMatch.exists)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah ok, this was written with the future in mind, the next product type (grouped) we introduce, inventoryLabel will no longer be a common field so i'll leave it as is for now.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! This is what I thought about, just wanted to be sure 🙂

}

public func verifyProductTypeScreenLoaded(productType: String) throws -> Self {
let priceLabel = NSPredicate(format: "label CONTAINS[c] %@", "price")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WDYT of renaming priceLabel to addPriceLabel, as done for addVariationLabel?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

updated in c9a64bc

XCTAssertTrue(app.staticTexts.containing(addVariationLabel).firstMatch.exists)
XCTAssertTrue(app.staticTexts.containing(inventoryLabel).firstMatch.exists)
default:
// fail test if product type doesn't exist
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the line below this comment has a good descriptive error message, so it's not necessary:

Suggested change
// fail test if product type doesn't exist

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed in c9a64bc

Comment on lines +31 to 37
func test_add_simple_virtual_product() throws {
try ProductFlow.addAndVerifyNewProduct(productType: "virtual")
}

func test_add_variable_product() throws {
try ProductFlow.addAndVerifyNewProduct(productType: "variable")
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

➕ for extracting the repetitive part to a flow. Nice 👍

@peril-woocommerce
Copy link

Warnings
⚠️ PR is not assigned to a milestone.

Generated by 🚫 dangerJS

@jostnes jostnes added this to the 11.7 milestone Dec 15, 2022
@jostnes jostnes merged commit c2bb7fe into trunk Dec 15, 2022
@jostnes jostnes deleted the add-virtual-product-ui-test branch December 15, 2022 06:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

category: ui tests Related to UI testing. feature: product details Related to adding or editing products, including Product Settings.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants